Đổi gốc từ các hệ số khác Hệ thập lục phân

Phép chia lấy số dư trong cơ số nguồn

Phương pháp đổi một số sang hệ thập lục phân được thực hiện tương tự như phương pháp được áp dụng cho các hệ cơ số khác, bằng cách sử dụng phép chia lấy số nguyên và số dư trong hệ cơ số nguồn. Trên lý thuyết, phương pháp này có thể áp dụng được với bất cứ (một cặp) hệ cơ số nào. Song nói chung theo thói quen sử dụng của con người và trong kỹ thuật máy tính, phương pháp này được áp dụng với hệ thập phân và nhị phân. (Đối với hệ nhị phân, người ta còn có những phương pháp nhanh gọn hơn nữa.)

Chẳng hạn, nếu lấy d là số thập phân cần phải được đổi, thì dãy số hihi-1...h2h1 là những con số để biểu diễn số ở hệ thập lục phân tương ứng. Với cách tính dãy h như sau:

1. Hi:= d mod 16("mod" (modulus (tiếng Anh)): phép chia lấy dư, thực hiện phép chia số nguyên và lấy kết quả là số dư - chẳng hạn 17 mod 5 = 217/5 = 3, dư 2.)2. D := d − h i 16 {\displaystyle {\begin{matrix}D:={\frac {d-h_{i}}{16}}\end{matrix}}} 3. Nếu d == 0 thì kết quả là dãy số h); nếu không, quay trở lại bước 1.

Phần sau đây giới thiệu chu trình của thuật toán trên, lập trình bằng ngôn ngữ JavaScript, dùng để biến bất cứ một số thập phân nào sang hệ thập lục phân, kết quả trả về là một string (dãy các ký tự). Mục đích của ví dụ là minh họa chu trình của thuật toán (có thể dựa vào đấy để áp dụng cho các công dụng xử lý khác). Để áp dụng thuật toán này với dữ liệu cụ thể, có thể dùng các toán tử trong phép toán thao tác bit.

function toHex(d) { /* biến đổi sang hệ thập lục phân */ var r = d % 16; if(d-r==0) {return toChar(r);} else {return toHex((d-r)/16)+toChar(r);}}function toChar(n) { /* biến đổi số nguyên sang ký tự có thể đọc và in được */ var alpha = "0123456789ABCDEF"; return alpha.charAt(n);}

Cần lưu ý rằng cơ số "16" dùng ở trên có thể được thay thế bằng bất cứ cơ số nào (chẳng hạn hệ nhị phân (2), tam phân (3), bát phân (8) v.v..). Sau đây là thủ tục được minh họa bằng ngôn ngữ C++ để in ra một số ở hệ bất kì tương ứng với một số thập phân nhận vào.

const alpha = "0123456789ABCDEF";void printinbase(long d, short b) { // in ra số ở hệ cơ số b tương ứng với số thập phân d)  short r=d%b;  if (d-r) printinbase(d/b,b);  cout << alpha[r];}

Phép cộng và tính nhân trong hệ thập lục phân

Chúng ta có thể biến đổi bằng cách phân giải giá trị của vị trí của từng con số (hàng đơn vị, hàng chục, hàng trăm trong hệ thập phân chẳng hạn), rồi biến mỗi giá trị ấy sang giá trị tương ứng của hệ thập lục phân, sau đó làm phép cộng hay nhân trên con số ấy để được kết quả trong hệ thập lục phân. (khi làm tính nhân, nên có sẵn một bảng cửu chương trong hệ tương ứng (thập lục phân) để dễ đối chiếu - vì đa số chỉ biết bảng cửu chương trong hệ thập phân mà thôi). (Number system - Computer Methods in Chemical Engineering)

Ví dụ: 12310 + 45610

          10010 + 2010 + 310        + 40010 + 5010 + 610       ----------------------     hay           6416 + 1416 + 316        + 19016 + 3216 + 616       ----------------------          1F416 + 4616 + 916           11   (Nhớ)         -------------           1F416        50010         +  4616       + 7010              916          910           -----         -----           24316        57910 

Phép đổi thông qua hệ nhị phân

máy vi tính nói chung dùng hệ nhị phân, nên phương pháp đổi của máy thường là thông qua hệ nhị phân trước đã, sau đó dùng sự thông nối trực tiếp giữa thập lục phân và nhị phân, mà đổi sang hệ thập lục phân.

Tài liệu tham khảo

WikiPedia: Hệ thập lục phân http://www.intuitor.com/hex/ http://www.mathsisfun.com/hexadecimal-decimal-colo... http://www.pcnineoneone.com/howto/hex1.html http://acms.synonet.com/bendix/intro/bitsof.pdf http://www.thinkgeek.com/tshirts/frustrations/6596... http://www.web-colors-explained.com/hex.php http://www.engr.umd.edu/~nsw/ench250/number.htm http://www.insidereality.net/site/content/math/bas... http://leetkey.mozdev.org https://commons.wikimedia.org/wiki/Category:Hexade...